class UsuariosController < ApplicationController
  before_filter  :set_modulos#, :only=>[:show,:micuenta,:new,:edit,:actualizar_datos]
  #DESC: Acciones relacionadas a los usuarios
  #MODULE: Gestión de personas
  
  def lugar_actual #IGNORE
    if @usuario
      "#{controller_name}: #{action_name} - #{@usuario.nombre} "
    else
      controller_name
    end
  end
  # GET /usuarios
  # GET /usuarios.xml
  def index
    respond_to do |wants|
      wants.html
    end
  end

  def micuenta #DESC: Acceder a la cuenta personal del usuario.
    @usuario = current_user
    draw_map
    render :template => "usuarios/show"
  end

  def actualizar_datos #DESC: Permite actualizar SOLO los datos del usuario logueado.
    if params[:id].to_i==current_user.id
      @usuario = current_user
      draw_map(true)
      render :template => "usuarios/edit"
    else
      redirect_to denegado_path
    end
  end

  # GET /usuarios/1
  # GET /usuarios/1.xml
  def show
    #TODO: Eliminar esta parte una vez eliminado el tipo movimiento adelanto de aguinaldo
    @usuario||= Usuario.find(params[:id])
    draw_map
    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @usuario }
      format.pdf  { render :layout => false }
    end
  end

  # GET /usuarios/new
  # GET /usuarios/new.xml
  def new
    @usuario = Usuario.new
    @usuario.activo = true
    @usuario.fecha_negociada= Date.today
    draw_map(true)
 
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @usuario }
    end
  end

  # GET /usuarios/1/edit
  def edit #DESC: Permite editar los datos de TODOS los usuarios.
    @usuario = Usuario.find(params[:id])
    draw_map(true)
    render :template => "usuarios/editar_negociadas" if params[:negociadas]
  end

  def editar_vacaciones_negociadas #DESC: Permite editar sus vacaciones negociadas, el que este valor sea distinto de cero hace que solo considere este valor como dias disponibles para vacaciones
    @usuario||= Usuario.find(params[:id])
    respond_to do |format|
      format.html {}
      format.js {render :layout => false}
    end
  end

  # POST /usuarios
  # POST /usuarios.xml
  def create #IGNORE
    @usuario = Usuario.new(params[:usuario])
  
    respond_to do |format|
      if @usuario.save
        flash[:notice] =  'Usuario creado correctamente.'
        format.html { redirect_to(@usuario) }
      else
        format.html {
          draw_map(true)
          render :action => "edit"
        }
        format.xml  { render :xml => @usuario.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /usuarios/1
  # PUT /usuarios/1.xml
  def update #IGNORE
    #TODO: verificar esta parte Asumir que no se marco nada
    unless params[:usuario][:vacaciones_negociadas]
      modulos_permitidos=current_user.submodulos.map(&:nombre)
      {:perfil_ids=>"Perfiles",:predefinido_ids=>"Datos Administrativos",
        :hobbie_ids=>"Pasatiempos",:talento_ids=>"Pasatiempos"}.each do |key,value|
        params[:usuario][key]||=[] if modulos_permitidos.include?(value)
      end
    else
      params[:usuario][:fecha_negociada]=Date.today
    end

    @usuario = Usuario.find(params[:id])
    #cargo_actual_id=@usuario.cargo_id
    respond_to do |format|
      if @usuario.update_attributes(params[:usuario])
        Solicitud.responder(current_user,@usuario)
        #TODO: Al cambiar de cargo, se crea un nuevo contrato..CONSIDERAR ESTA FUNCIONALIDAD?
#        unless params[:usuario][:cargo_id].nil?
#          @usuario.actualizar_historico_laboral(params[:usuario]) if cargo_actual_id != params[:usuario][:cargo_id].to_i
#        end
        format.html {
          flash[:notice] = 'Usuario actualizado correctamente.'
          redirect_to(cuenta(@usuario)) }
        format.xml  { head :ok }
        format.js {
          render :update do |page|
            page.replace_html :vacaciones, :partial=>"usuarios/datos_laborales/modulo_vacaciones.html",:locals=>{:usuario=>@usuario}
            page << "makeColorBox()"
          end
        }
      else
        format.html {
          draw_map(true)
          render :action => "edit"
        }
        format.xml  { render :xml => @usuario.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /usuarios/1
  # DELETE /usuarios/1.xml
  def destroy
    @usuario = Usuario.find(params[:id])
    #@usuario.destroy
    @usuario = @usuario.update_attribute(:deleted_at, Time.now)
    respond_to do |format|
      format.html { redirect_to(usuarios_url) }
      format.xml  { head :ok }
    end
  end

  #Leer listado de usuarios
  def datos #IGNORE
    #Realizar consulta
    params["_search"]="true" if params[:activo]
    registros, count = find_by_params(params, :class => Usuario.vigentes)
    # Construct a hash from the ActiveRecord result
    return_data = Hash.new()
    return_data[:page] = params[:page]
    return_data[:total] = (count.to_f / params[:rows].to_i).ceil
    return_data[:records] = count

    return_data[:rows] = registros.collect{|u| {:id => u.id,
        :cell => [
          u.nombres, u.apellidos,u.email, u.es_activo?
        ]}}

    render :text => return_data.to_json, :layout => false
  end

  def reporte #DESC: Descarga reporte de usuario
    @usuario = Usuario.find(params[:id])
  end
  
  def descargar_planes #DESC: Descargar Reporte de Planes Acciones
    respond_to do |wants|
      wants.csv do
        csv_string=PlanAccion.reporte_completo
        # send it to the browsah
        send_data csv_string,
          :type => 'text/csv; charset=iso-8859-1; header=present',
          :disposition => "attachment; filename=planes_accion.csv"
      end
    end
  end

  def comboactivos #IGNORE
    render :layout => false
  end

  #Filtra los usuarios activos por su antiguedad según se cumpla la condición
  #de comparación entre su antiguedad medida y el valor de referencia, ambos son
  #pasados a meses indiferentemente de la unidad elegida.
  def filtrar_por_antiguedad #DESC: Permite Filtrar los usuarios activos por antiguedad.
    @filtrados,@filtro=[],"Seleccione un filtro."
    if request.method == :post
      Usuario.activos.all.each do |u|
        antiguedad=u.antiguedad
        valor,referencia = get_en_meses(antiguedad,params)
        if eval(valor.to_s+params[:comparacion]+referencia.to_s)
          u[:antigueda]=antiguedad["texto"]
          @filtrados<<u
          @filtro="#{@filtrados.count} funcionarios con antiguedad #{Usuario::COMPARACIONES.index(params[:comparacion]).downcase} #{params[:referencia]} #{params[:unidad]}"
        end
      end#eah
      render :update do |page|
        page.replace_html :resultados,:partial=>"filtrados_por_antiguedad"
      end
    end
  end

  #Sueldo bruto con beneficios y comisiones
  def descargar_funcionarios #DESC: Descargar Reporte General de Usuarios
    respond_to do |wants|
      wants.html {render :layout => false}
      wants.csv do
        csv_string = Usuario.planilla_funcionarios(params[:date][:month],params[:date][:year])
        # send it to the browsah
        send_data csv_string,
          :type => 'text/csv; charset=iso-8859-1; header=present',
          :disposition => "attachment; filename=funcionarios.csv",
          :encoding => 'U'
      end
    end
  end

  private
  def draw_map(editable=false)
    point= (@usuario.lat.nil? or @usuario.lng.nil?) ? [-25.289363,-57.627784] : [@usuario.lat,@usuario.lng]
    pos_ini=GLatLng.new(point)

    @map = GMap.new("map_div")
    @map.center_zoom_init(pos_ini,15)
        
    @map.set_map_type_init(GMapType::G_NORMAL_MAP)
    @map.control_init(:large_map=>true, :local_search => true,:local_search_options => '{suppressZoomToBounds : true, resultList : google.maps.LocalSearch.RESULT_LIST_INLINE, suppressInitialResultSelection : true, searchFormHint : "Local Search powered by Google", linkTarget : GSearch.LINK_TARGET_BLANK}',:anchor => :bottom_right, :offset_width => 0, :offset_height => -40)
    @map.interface_init({:scroll_wheel_zoom => true, :continuous_zoom => true,:double_click_zoom=>false})
    icono=get_pin_icon
    options='{onSearchCompleteCallback : function() { alert("search is complete");}}'
    @map.record_global_init("var options='#{options}'")
    @map.icon_global_init(icono,"house")
    @marker=get_house_marker(pos_ini,icono,editable)
    @map.overlay_global_init(@marker,'houseMarker')
    init_events if editable
  end

  def init_events
    pos_map="map.setCenter(latlng);"
    pos_marker= "houseMarker.setPoint(latlng);"
    save_pos= "savePosition();"

    function_body="$('#lat').val(latlng.lat());$('#lng').val(latlng.lng());#{pos_marker};#{pos_map}"
    @map.event_init(@map,:dblclick,"function(overlay, latlng){#{function_body};}")
    @map.event_init(@map,:load,"function(){#{save_pos};}")
    @map.event_init(@marker,:dragend,"function(latlng){#{function_body}}")
  end

  def get_pin_icon
    GIcon.new(:image =>"#{ENV['RAILS_RELATIVE_URL_ROOT']}/images/pin-house.png",:shadow => "#{ENV['RAILS_RELATIVE_URL_ROOT']}/images/pin-house-shadow.png",
      :icon_size => GSize.new(32,32),:shadow_size => GSize.new(37,32),
      :icon_anchor => GPoint.new(9,32),
      :info_window_anchor => GPoint.new(9,2),
      :info_shadow_anchor =>GPoint.new(18,25))
  end

  def get_house_marker(pos,icono,editable)
    GMarker.new(pos,
      :title => "Domicilio de #{@usuario.nombre}",
      :info_window => "This description<br/> can have <b>HTML</b> in it!",
      :draggable => editable,
      :icon=>icono)
  end

  #Se utiliza como soporte al modulo de seguridad, determian que submodulos,
  #en las vistas "show", "micuenta", "edit" y "actualizar_datos", tiene permitido
  #ver el current_user.
  ##OBS: los submodulos visibles son los mismos para toda las vistas mencionadas arriba.
  #TODO: Mejorar jerarquia de modulos, se podría utilizar una bandera en la tabla
  #controllers para indicar que ese controller es un modulo.. pero que pasa con los "submodulos?"
  def set_modulos
    @modulos=Modulo.get_submodulos(controller_name,current_user)
  end

  #Utilizado en el def filtrado_por_antiguedad.
  #Retorna la antigueda y el parametro tomado como referencia en meses
  def get_en_meses(antiguedad,params)
    return params[:unidad]=="años" ?
      [antiguedad[params[:unidad]]*12+antiguedad["meses"],params[:referencia].to_i*12] :
      [antiguedad[params[:unidad]]+antiguedad["años"]*12,params[:referencia]]
  end

end
